package com.xtm.exercise.base.A12threadDemo.ThreadSafe;
/*
    线程安全:
        如果有多个线程在同时运行，而这些线程可能会同时运行这段代码。
        程序每次运行结果和单线程运行的结果是一样 的，而且其他的变量的值也和预期的是一样的，就是线程安全的。

        若每个线程中对全局变量、静态变量只有读操作，而无写 操作，一般来说，这个全局变量是线程安全的；
        若有多个线程同时执行写操作，一般都需要考虑线程同步， 否则的话就可能影响线程安全。

    线程同步:
        要解决上述多线程并发访问一个资源的安全性问题:也就是解决重复票与不存在票问题，Java中提供了同步机制 (synchronized)来解决。
        窗口1线程进入操作的时候，窗口2和窗口3线程只能在外等着，窗口1操作结束，窗口1和窗口2和窗口3才有机会进入代码 去执行。也就是说在某个线程修改共享资源的时候，其他线程不能修改该资源，等待修改完毕同步之后，才能去抢夺CPU 资源，完成对应的操作，保证了数据的同步性，解决了线程不安全的现象。

        为了保证每个线程都能正常执行原子操作,Java引入了线程同步机制。
        那么怎么去使用呢？有三种方式完成同步操作：
        1. 同步代码块。 2. 同步方法。 3. 锁机制。

    模拟卖票案例
    创建3个线程,同时开启,对共享的票进行出售
 */
public class Demo01Ticket {
    public static void main(String[] args) {
        //创建Runnable接口的实现类对象
        //创建线程任务对象
        RunnableImpl run = new RunnableImpl();
        //创建Thread类对象,构造方法中传递Runnable接口的实现类对象
        //创建三个窗口对象
        Thread t0 = new Thread(run,"窗口1");
        Thread t1 = new Thread(run,"窗口2");
        Thread t2 = new Thread(run,"窗口3");
        //调用start方法开启多线程
        //同时卖票
        t0.start();
        t1.start();
        t2.start();

        /**
         * 发现程序出现了两个问题：
         *      1. 相同的票数,比如5这张票被卖了两回。
         *      2. 不存在的票，比如0票与-1票，是不存在的。
         * 这种问题，几个窗口(线程)票数不同步了，这种问题称为线程不安全。
         *      线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作，而无写 操作，一般来说，这个全局变量是线程安全的；
         *      若有多个线程同时执行写操作，一般都需要考虑线程同步， 否则的话就可能影响线程安全。
         */
    }
}
